{$CLEO .qa}
{$USE CLEO+}
{$USE newOpcodes}
{$USE ini}

0000: NOP

script_name "WindWsh"

// By ArtemQa146

const
   obj_balc = 31@
   obj_balc2 = 28@
   washer1 = 0@
   washer2 = 30@
   up_down = 26@
   Coords_X = 25@
   Coords_Y = 24@
   Coords_Z = 23@
   Angle_Z = 22@
   up_down_distance = 21@
   time_random = 20@
   check_actor_obj = 19@
end

0085: 29@ = 0@ // (int)
0085: 27@ = 1@ // (int)

while true
wait 250
    if
        player.Defined(0)
    then
    
        2@ = false
        
        // SF
        
        if
            0EEA: locate_char_distance_to_coordinates $player_actor pos -2016.292 442.9872 75.2456 radius 200.0
        then
            Coords_X = -2016.292
            Coords_Y = 442.9872
            Coords_Z = 65.2456
            Angle_Z = 90.0
            2@ = true
        end
        
        if
            0EEA: locate_char_distance_to_coordinates $player_actor pos -1967.2974 531.8922 100.2716 radius 200.0
        then
            Coords_X = -1967.2974
            Coords_Y = 531.8922
            Coords_Z = 100.2716
            Angle_Z = 270.0
            2@ = true
        end
        
        if
            0EEA: locate_char_distance_to_coordinates $player_actor pos -1733.3652 790.6758 75.1478 radius 200.0
        then
            Coords_X = -1733.3652
            Coords_Y = 790.6758
            Coords_Z = 75.1478
            Angle_Z = 90.1098
            2@ = true
        end
        
        if
            0EEA: locate_char_distance_to_coordinates $player_actor pos -1811.0698 1080.5298 63.499 radius 200.0
        then
            Coords_X = -1811.0698
            Coords_Y = 1080.5298
            Coords_Z = 63.499
            Angle_Z = 90.1098
            2@ = true
        end
        
        // LA
        
        if
            0EEA: locate_char_distance_to_coordinates $player_actor pos 1661.4913 -1278.0686 60.9861 radius 200.0
        then
            Coords_X = 1661.4913
            Coords_Y = -1278.0686
            Coords_Z = 60.9861
            Angle_Z =0.0
            2@ = true
        end
        
        if
            0EEA: locate_char_distance_to_coordinates $player_actor pos 1836.3511 -1301.424 45.8235 radius 200.0
        then
            Coords_X = 1836.3511
            Coords_Y = -1301.424
            Coords_Z = 45.9511
            Angle_Z = 90.0
            2@ = true
        end
        
        if
            0EEA: locate_char_distance_to_coordinates $player_actor pos 1597.9847 -1236.3354 70.0594 radius 200.0
        then
            Coords_X = 1597.9847
            Coords_Y = -1236.3354
            Coords_Z = 70.0594
            Angle_Z = 90.0
            2@ = true
        end
        
        if
            0EEA: locate_char_distance_to_coordinates $player_actor pos 1510.2345 -1055.1655 66.0611 radius 200.0
        then
            Coords_X = 1510.2345
            Coords_Y = -1055.1655
            Coords_Z = 66.0594
            Angle_Z = 180.0
            2@ = true
        end

        
        if 0EEA: locate_char_distance_to_coordinates $player_actor pos Coords_X Coords_Y Coords_Z radius 100.0
        then continue
        end
        
        if
            2@ == true // 
        then
        
            repeat
            wait 0
            04ED: load_animation  "PedEventsMod"
            until 04EE:   animation "PedEventsMod" loaded
        
            model.load(14781)
            model.Load(27)
            model.Load(260)
            model.Load(3243)
            if
                not model.Available(14781)
            then
                repeat
                wait 0
                model.Load(14781)
                until model.Available(14781)
            end
            if
                not model.Available(27)
            then
                repeat
                wait 0
                model.Load(27)
                until model.Available(27)
            end
            if
                not model.Available(260)
            then
                repeat
                wait 0
                model.Load(260)
                until model.Available(260)
            end
            if
                not model.Available(3243)
            then
                repeat
                wait 0
                model.Load(3243)
                until model.Available(3243)
            end
            038B: load_requested_models
            0E01: create_object_no_save 14781 at Coords_X Coords_Y Coords_Z offset 0 ground 0 to obj_balc  //  , 
            0177: set_object obj_balc Z_angle_to Angle_Z
            0400: store_coords_to 1@ 2@ 3@ from_object obj_balc with_offset 0.0 0.6 0.0
            01BC: put_object obj_balc at 1@ 2@ 3@
            0400: store_coords_to 1@ 2@ 3@ from_object obj_balc with_offset 0.0 0.0 0.0
            0E01: create_object_no_save 3243 at 1@ 2@ 3@ offset 0 ground 0 to obj_balc2 //   ,   ,     
            0382: set_object obj_balc2 collision_detection 0
            0400: store_coords_to 1@ 2@ 3@ from_object obj_balc with_offset 1.5 -1.0 0.0
            009A: washer1 = create_actor_pedtype 4 model 27 at 1@ 2@ 3@
            0400: store_coords_to 1@ 2@ 3@ from_object obj_balc with_offset -0.8 -1.0 0.0
            009A: washer2 = create_actor_pedtype 4 model 260 at 1@ 2@ 3@
            model.Destroy(14781)
            model.Destroy(27)
            model.Destroy(260)
            model.Destroy(3243)
            0176: 1@ = object obj_balc Z_angle
            0173: set_actor washer1 Z_angle_to 1@
            0173: set_actor washer2 Z_angle_to 1@
            0177: set_object obj_balc2 Z_angle_to 1@
            08D2: object obj_balc scale_model 0.0
            08D2: object obj_balc2 scale_model 0.0
            0F04: create_render_object_to_object_from_special obj_balc2 special_model 29@ offset 0 0 0 rotation 0 0 0 store_to 1@ // 
            0F04: create_render_object_to_object_from_special obj_balc special_model 29@ offset 0 0 0 rotation 0 0 0 store_to 1@  // 
            0F02: create_render_object_to_char_bone_from_special washer1 special_model 27@ bone 24 offset 0 0 0 rotation 0 0 0 store_to 1@
            0F02: create_render_object_to_char_bone_from_special washer2 special_model 27@ bone 34 offset 0 0 0 rotation 0 0 0 store_to 1@
            
            gosub @Distance
            gosub @Tasks
            
            repeat
            wait 0
            gosub @Check_actor_obj
            if and
                check_actor_obj == true
                $ACTIVE_INTERIOR == 0
                0EEA: locate_char_distance_to_coordinates $player_actor pos Coords_X Coords_Y Coords_Z radius 220.0
            then
            
                if or
                    051A:   actor washer1 damaged_by_actor $PLAYER_ACTOR
                    051A:   actor washer2 damaged_by_actor $PLAYER_ACTOR
                    0118:   actor washer1 dead
                    0118:   actor washer2 dead
                then
                    01C2: remove_references_to_actor washer1 // Like turning an actor into a random pedestrian
                    01C2: remove_references_to_actor washer2 // Like turning an actor into a random pedestrian
                    repeat
                    wait 0
                    until not locate_char_distance_to_coordinates $player_actor pos Coords_X Coords_Y Coords_Z radius 250.0
                    break
                end


            
                if
                    001D:   time_random > timera  // (int)
                then
                    0393: actor washer2 perform_animation "wash_left" at 0.3 times_normal_rate
                    0393: actor washer2 perform_animation "wash_right" at 1.0 times_normal_rate
                else
                
                    //     ,  
                    0687: clear_actor washer1 task
                    0687: clear_actor washer2 task
                    0619: enable_actor washer1 collision_detection 0
                    0619: enable_actor washer2 collision_detection 0
                    0575: set_actor washer1 pinned_position 1
                    0575: set_actor washer2 pinned_position 1
                    04C4: store_coords_to 1@ 2@ 3@ from_actor washer1 with_offset 0.0 0.0 -1.0
                    04C4: store_coords_to 4@ 5@ 3@ from_actor washer2 with_offset 0.0 0.0 -1.0
                    0400: store_coords_to 6@ 7@ 8@ from_object obj_balc with_offset 0.0 0.0 0.0
                    
                    0812: AS_actor washer1 perform_animation "Pose" IFP "PedEventsMod" framedelta 2.0 loopA 1 lockX 0 lockY 0 lockF 0 time -1  // versionB
                    0812: AS_actor washer2 perform_animation "Stand_1" IFP "PedEventsMod" framedelta 2.0 loopA 1 lockX 0 lockY 0 lockF 0 time -1  // versionB
                    10@ = 0.0
                    
                    //       
                    repeat
                    wait 0
                        gosub @Check_actor_obj
                        if
                            check_actor_obj == true
                        then
                            10@ += 0.03
                            if
                                up_down == false
                            then
                                8@ += 0.03
                                3@ += 0.03
                            else
                                8@ -= 0.03
                                3@ -= 0.03
                            end
                            01BC: put_object obj_balc at 6@ 7@ 8@
                            01BC: put_object obj_balc2 at 6@ 7@ 8@
                            00A1: put_actor washer1 at 1@ 2@ 3@
                            00A1: put_actor washer2 at 4@ 5@ 3@
                        else
                            break
                        end
                    until 0025:   10@ > up_down_distance  // (float)

                    //   ,    ,  
                    if
                        up_down == false
                    then
                        up_down = true
                    else
                        gosub @Distance
                    end
                    
                    //  
                    gosub @Check_actor_obj
                    if
                        check_actor_obj == true
                    then
                        0575: set_actor washer1 pinned_position 0
                        0575: set_actor washer2 pinned_position 0
                        0619: enable_actor washer1 collision_detection 1
                        0619: enable_actor washer2 collision_detection 1
                        gosub @Tasks
                    end
                end
            else
                break
            end
            until not player.Defined(0)
            if 056D:   actor washer1 defined
            then 009B: destroy_actor washer1
            end
            if 056D:   actor washer2 defined
            then 009B: destroy_actor washer2
            end
            if 03CA:   object obj_balc exists
            then 0108: destroy_object obj_balc
            end
            if 03CA:   object obj_balc2 exists
            then 0108: destroy_object obj_balc2
            end
            04EF: release_animation "PedEventsMod"
            0A93: terminate_this_custom_script
        end
    end
end

:Check_actor_obj
check_actor_obj = false
if and
    056D:   actor washer2 defined
    056D:   actor washer1 defined
    03CA:   object obj_balc exists
    03CA:   object obj_balc2 exists
then
    check_actor_obj = true
end
return

:Tasks
0812: AS_actor washer1 perform_animation "wash_right" IFP "PedEventsMod" framedelta 2.0 loopA 1 lockX 0 lockY 0 lockF 0 time -1  // versionB
0812: AS_actor washer2 perform_animation "wash_left" IFP "PedEventsMod" framedelta 2.0 loopA 1 lockX 0 lockY 0 lockF 0 time -1  // versionB
timera = 0
0209: time_random = random_int_in_ranges 10000 60000 //      
return

:Distance
up_down = false
0208: up_down_distance = random_float_in_ranges 5.0 20.0 //   
return

